//  思路： 迭代递归,对每次循环都重新进行递归调用
        //    递归结束条件： sum > target 结束递归  sum == traget 结束递归，并将结果（数组）添加进入res
        //    继续递归  sum < traget , 继续对 start 开始递归循环

let combinationSum = function (candidates, target) {
    let res = []
  
    let helper = (start, prevSum, prevArr) => {
    //  三个参数，start,prevSum,prevArr
    //  prevArr : 表示以前存在保存的数组
    //  prevSum : 表示以前数组的sum总和
    //  start : 表示从哪开始递归迭代，可以从自身迭代因为可以重复




      // 由于全是正整数 所以一旦和大于目标值了 直接结束本次递归即可。
      if (prevSum > target) {
        return
      }
      // 目标值达成
      if (prevSum === target) {
        res.push(prevArr)
        return
      }
  
      for (let i = start; i < candidates.length; i++) {
        // 这里还是继续从start本身开始 因为多个重复值是允许的
        let cur = candidates[i]
        let sum = prevSum + cur
        let arr = prevArr.concat(cur)
        helper(i, sum, arr)
      }
    }
  
    helper(0, 0, [])
  
    return res
  }